package com.netease.nim.demo.common.util.sys;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.os.Build;
import android.os.PowerManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
public class SysInfoUtil {
public static final String getOsInfo() {
return android.os.Build.VERSION.RELEASE;
}
public static final String getPhoneModelWithManufacturer() {
return Build.MANUFACTURER + " " + android.os.Build.MODEL;
}
public static final String getPhoneMode() {
return Build.MODEL;
}
public static final boolean isAppOnForeground(Context context) {
ActivityManager manager = (ActivityManager) context
.getApplicationContext().getSystemService(
Context.ACTIVITY_SERVICE);
String packageName = context.getApplicationContext().getPackageName();
List<ActivityManager.RunningAppProcessInfo> list = manager
.getRunningAppProcesses();
if (list == null)
return false;
boolean ret = false;
Iterator<ActivityManager.RunningAppProcessInfo> it = list.iterator();
while (it.hasNext()) {
ActivityManager.RunningAppProcessInfo appInfo = it.next();
if (appInfo.processName.equals(packageName)
&& appInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
ret = true;
break;
}
}
return ret;
}
public static final boolean isScreenOn(Context context) {
PowerManager powerManager = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
return powerManager.isScreenOn();
}
public static boolean stackResumed(Context context) {
ActivityManager manager = (ActivityManager) context
.getApplicationContext().getSystemService(
Context.ACTIVITY_SERVICE);
String packageName = context.getApplicationContext().getPackageName();
List<RunningTaskInfo> recentTaskInfos = manager.getRunningTasks(1);
if (recentTaskInfos != null && recentTaskInfos.size() > 0) {
RunningTaskInfo taskInfo = recentTaskInfos.get(0);
if (taskInfo.baseActivity.getPackageName().equals(packageName) && taskInfo.numActivities > 1) {
return true;
}
}
return false;
}
public static final boolean mayOnEmulator(Context context) {
if (mayOnEmulatorViaBuild()) {
return true;
}
if (mayOnEmulatorViaTelephonyDeviceId(context)) {
return true;
}
if (mayOnEmulatorViaQEMU(context)) {
return true;
}
return false;
}
private static final boolean mayOnEmulatorViaBuild() {
/**
* ro.product.model likes sdk
*/
if (!TextUtils.isEmpty(Build.MODEL) && Build.MODEL.toLowerCase().contains("sdk")) {
return true;
}
/**
* ro.product.manufacturer likes unknown
*/
if (!TextUtils.isEmpty(Build.MANUFACTURER) && Build.MANUFACTURER.toLowerCase().contains("unknown")) {
return true;
}
/**
* ro.product.device likes generic
*/
if (!TextUtils.isEmpty(Build.DEVICE) && Build.DEVICE.toLowerCase().contains("generic")) {
return true;
}
return false;
}
private static final boolean mayOnEmulatorViaTelephonyDeviceId(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (tm == null) {
return false;
}
String deviceId = tm.getDeviceId();
if (TextUtils.isEmpty(deviceId)) {
return false;
}
/**
* device id of telephony likes '0*'
*/
for (int i = 0; i < deviceId.length(); i++) {
if (deviceId.charAt(i) != '0') {
return false;
}
}
return true;
}
private static final boolean mayOnEmulatorViaQEMU(Context context) {
String qemu = getProp(context, "ro.kernel.qemu");
return "1".equals(qemu);
}
private static final String getProp(Context context, String property) {
try {
ClassLoader cl = context.getClassLoader();
Class<?> SystemProperties = cl.loadClass("android.os.SystemProperties");
Method method = SystemProperties.getMethod("get", String.class);
Object[] params = new Object[1];
params[0] = property;
return (String)method.invoke(SystemProperties, params);
} catch (Exception e) {
return null;
}
}
}